package cal;

import java.util.Calendar;
import java.util.Date;

/**
 * 
 * @author Michael Weng
 * 
 *         Klassen die Daten zur Erstellung der Kalenderansichten liefern.
 * 
 */

public class WeekData {

	/**
	 * * Sucht den ersten Wochentag des Monats in dem das Datum liegt. 1 =
	 * Montag, 2 = Dienstag... 7 = Sonntag
	 * 
	 * @param d
	 *            Datum zu dem Monat berechnet werden soll
	 * @return Erster Wochentag zu d
	 */

	public static int firstDay(Date d) {

		@SuppressWarnings("deprecation")
		int m = d.getMonth();
		@SuppressWarnings("deprecation")
		int j = d.getYear();

		@SuppressWarnings("deprecation")
		Date e = new Date(j, m, 1);
		@SuppressWarnings("deprecation")
		int f = e.getDay();
		// Eigendlich ist der Sontag 0. Wir machen ihn zur 7.
		if (f == 0)
			f = 7;
		return f;
	}

	/**
	 * ermittelt Länge des Monats
	 * 
	 * @param d
	 *            Datum zu dem Woche berechnet werden soll
	 * @return Integer der Länge des Monats angibt
	 */
	@SuppressWarnings("deprecation")
	public static int monthLength(Date d) {

		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, d.getYear());
		cal.set(Calendar.MONTH, d.getMonth());
		cal.set(Calendar.DATE, d.getDate());

		return cal.getActualMaximum(Calendar.DAY_OF_MONTH);
	}

	/**
	 * Ermittelt die Laenge des vorrigen Monats.
	 * 
	 * @param d
	 *            Datum zum berechnen der Länge des Vormonats
	 * @return Integer Länge des Vormants
	 */

	@SuppressWarnings("deprecation")
	public static int lastMonthLength(Date d) {

		int m = d.getMonth();
		int j = d.getYear();

		if (m == 0) {
			m = 11;
			j = j - 1;
		} else {
			m--;
		}
		Date e = new Date(j, m, 1);

		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, e.getYear());
		cal.set(Calendar.MONTH, e.getMonth());
		cal.set(Calendar.DATE, e.getDate());

		return cal.getActualMaximum(Calendar.DAY_OF_MONTH);
	}

	/**
	 * Gibt ein Date Array zurück mit den jeweiligen 7 Wochentagen.
	 * 
	 * @param d
	 *            Datum dessen Monat errechnet werden soll
	 * @return Array mit Datums des Monats
	 */

	@SuppressWarnings("deprecation")
	public static Date[] getDateArray(Date d) {

		// Date Array

		Date[] dateArray = new Date[7];

		// Date aufsplitten
		int jahr = d.getYear();
		int monat = d.getMonth();
		int tag = d.getDate();

		// Monatsl�ngen
		int monatsLaenge = monthLength(d);
		int vorMonatsLaenge = lastMonthLength(d);

		// Wochentag
		int wochenTag = d.getDay();
		if (wochenTag == 0) {
			wochenTag = 7;
		}

		// Setzt alle Tage dieser Woche vor dem Date d
		for (int i = wochenTag - 1; i > 0; i--) {
			if (tag == 1) {
				if (monat == 0) {
					monat = 11;
					tag = vorMonatsLaenge;
					jahr--;
				} else {
					tag = vorMonatsLaenge;
					monat--;
				}
			} else {
				tag--;
			}
			dateArray[i - 1] = new Date(jahr, monat, tag);

		}

		// Setzt den aktuellen Tag
		dateArray[wochenTag - 1] = d;

		// Holt sich die Daten erneut aus dem Date und setzt alle kommenden
		// Wochentage
		jahr = d.getYear();
		monat = d.getMonth();
		tag = d.getDate();

		for (int i = wochenTag; i < 7; i++) {
			if (tag == monatsLaenge) {
				if (monat == 11) {
					jahr++;
					tag = 1;
					monat = 0;
				} else {
					monat++;
					tag = 1;
				}
			} else {
				tag++;
			}

			dateArray[i] = new Date(jahr, monat, tag);
		}

		return dateArray;
	}

	/**
	 * * Gibt ein String Array der Größe 7 zurück in denen 7 Tage stehen. Im
	 * Format "WW, DD.(M)M." (W=Wochentag; D=Tag; M=Monat)
	 * 
	 * @param d
	 *            Datum zu dem Monat berechnet wird
	 * @param speak
	 *            Sprache die verwendet werden soll
	 * @return String Array, das Kürzel der Wochentage enthält
	 */

	@SuppressWarnings("deprecation")
	public static String[] getStringArray(Date d, int speak) {

		// Initialisiert String Array
		String[] wochenArray = new String[7];

		// Generiert Date Array
		Date[] dates = getDateArray(d);

		for (int i = 0; i < 7; i++) {
			int t = dates[i].getDate();
			int m = dates[i].getMonth();

			String wtS = "";

			if (i == 6) {
				if (speak == 0) {
					wtS = "So., ";
				}
				if (speak == 1) {
					wtS = "Su., ";
				}
				if (speak == 2) {
					wtS = "So., ";
				}

			}
			if (i == 0) {
				if (speak == 0) {
					wtS = "Mo., ";
				}
				if (speak == 1) {
					wtS = "Mo., ";
				}
				if (speak == 2) {
					wtS = "Lu., ";
				}

			}
			if (i == 1) {
				if (speak == 0) {
					wtS = "Di., ";
				}
				if (speak == 1) {
					wtS = "Tu., ";
				}
				if (speak == 2) {
					wtS = "Ma., ";
				}

			}
			if (i == 2) {
				if (speak == 0) {
					wtS = "Mi., ";
				}
				if (speak == 1) {
					wtS = "We., ";
				}
				if (speak == 2) {
					wtS = "Me., ";
				}

			}
			if (i == 3) {
				if (speak == 0) {
					wtS = "Do., ";
				}
				if (speak == 1) {
					wtS = "Th., ";
				}
				if (speak == 2) {
					wtS = "Io., ";
				}

			}
			if (i == 4) {
				if (speak == 0) {
					wtS = "Fr., ";
				}
				if (speak == 1) {
					wtS = "Fr., ";
				}
				if (speak == 2) {
					wtS = "Ve., ";
				}

			}
			if (i == 5) {

				wtS = "Sa., ";

			}

			wtS += t + "." + (m + 1) + "";

			wochenArray[i] = wtS;
		}

		return wochenArray;

	}

	/**
	 * * Gibt einen String zurück der die Zeitspanne angiebt in der Form:
	 * "DD.MM. - DD.MM."
	 * 
	 * @param d
	 *            Datum zu dem die Woche berechnet wird
	 * @return String zur Angabe der Woche
	 */

	@SuppressWarnings("deprecation")
	public static String getWeekString(Date d) {

		Date[] dateArray = getDateArray(d);
		int tag1 = dateArray[0].getDate();
		int monat1 = dateArray[0].getMonth();

		int tag2 = dateArray[6].getDate();
		int monat2 = dateArray[6].getMonth();

		return tag1 + "." + (monat1 + 1) + ". - " + tag2 + "." + (monat2 + 1)
				+ ".";
	}

	/**
	 * Berechnet nächsten Montag
	 * 
	 * @param d
	 *            Datum zu dem der nächste Montag berechnet werden soll
	 * @return Datum des nächsten Montags
	 */
	@SuppressWarnings({ "deprecation", "unused" })
	public static Date getNextMonday(Date d) {

		Date runningD = d;
		int aktWochenTag = d.getDay();

		do {

			int tag = runningD.getDate();
			int monat = runningD.getMonth();
			int jahr = runningD.getYear();

			if (tag == monthLength(runningD)) {

				if (monat == 11) {
					jahr++;
					monat = 0;
					tag = 1;
				} else {
					monat++;
					tag = 1;
				}
			} else {

				tag++;
			}
			runningD.setDate(tag);
			runningD.setMonth(monat);
			runningD.setYear(jahr);

		} while (runningD.getDay() != 1);

		return runningD;

	}

	/**
	 * Berechnet Datum des letzten Montags
	 * 
	 * @param d
	 *            Datum zu dem letzter Montag berechnet werden sol
	 * @return Datum des letzten Montags
	 */
	@SuppressWarnings({ "deprecation", "unused" })
	public static Date getLastMonday(Date d) {

		Date runningD = d;
		int aktWochenTag = d.getDay();

		do {

			int tag = runningD.getDate();
			int monat = runningD.getMonth();
			int jahr = runningD.getYear();

			if (tag == 1) {

				if (monat == 0) {
					jahr--;
					monat = 11;
					tag = lastMonthLength(runningD);
				} else {
					monat--;
					tag = lastMonthLength(runningD);
				}
			} else {

				tag--;
			}
			runningD.setDate(tag);
			runningD.setMonth(monat);
			runningD.setYear(jahr);

		} while (runningD.getDay() != 1);

		return runningD;

	}

}
